package iagovsothello.online.client;
import iagovsothello.gui.TextAreaCapoAutomatico;
import iagovsothello.online.server.ServerWindow;

import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;

import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;

import javax.swing.WindowConstants;
import javax.swing.border.LineBorder;
import javax.swing.SwingUtilities;


/**
* This code was edited or generated using CloudGarden's Jigloo
* SWT/Swing GUI Builder, which is free for non-commercial
* use. If Jigloo is being used commercially (ie, by a corporation,
* company or business for any purpose whatever) then you
* should purchase a license for each developer using Jigloo.
* Please visit www.cloudgarden.com for details.
* Use of Jigloo implies acceptance of these licensing terms.
* A COMMERCIAL LICENSE HAS NOT BEEN PURCHASED FOR
* THIS MACHINE, SO JIGLOO OR THIS CODE CANNOT BE USED
* LEGALLY FOR ANY CORPORATE OR COMMERCIAL PURPOSE.
*/
public class IntroWindowClient extends javax.swing.JFrame {
	private JPanel rulesPanel;
	private JButton sendFormButton;
	private JTextField idTextField;
	private JTextField surnameTextField;
	private JTextField nameTextField;
	private JLabel idLabel;
	private JLabel surnameLabel;
	private JLabel nameLabel;
	private JPanel jPanel1;
	private JScrollPane jScrollPane1;
	private TextAreaCapoAutomatico rulesTextArea1;
	private JLabel titleLabel;
	private Socket socket;
	private static String addressIPServer = "192.168.100.53";//sulla macchina dove DOVREBBE andare l'indirizzo sara' 192.168.100.53
	private static int portServer = 7777;
	
	
	private static IntroWindowClient actualWindow;
	//public static final int PORT = 7777;

	
	/**
	* Auto-generated main method to display this JFrame
	*/
	public static void main(String[] args) {
		SwingUtilities.invokeLater(new Runnable() {
			public void run() {
				
				IntroWindowClient inst = new IntroWindowClient();
				IntroWindowClient.setActualWindow(inst);
				inst.setLocationRelativeTo(null);
				inst.setVisible(true);
				
			}
		});
	}
	
	public IntroWindowClient() {
		super();
		initGUI();
		//addressIP = JOptionPane.showInputDialog(this, "INSERIRE INDIRIZZO IP DEL SERVER", "192.168.1.1");
	}
	
	
	private void initGUI() {
		actualWindow = null;
		try {
			GridBagLayout thisLayout = new GridBagLayout();
			setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
			thisLayout.rowWeights = new double[] {0.1, 0.1, 0.1, 0.1, 0.1};
			thisLayout.rowHeights = new int[] {20, 7, 7, 7, 7};
			thisLayout.columnWeights = new double[] {0.1, 0.1, 0.1, 0.1};
			thisLayout.columnWidths = new int[] {7, 7, 7, 7};
			getContentPane().setLayout(thisLayout);
			this.setTitle("IAgo VS Othello");
			this.setResizable(false);
			{
				rulesPanel = new JPanel();
				GridBagLayout rulesPanelLayout = new GridBagLayout();
				getContentPane().add(rulesPanel, new GridBagConstraints(1, 1, 1, 1, 0.0, 0.0, GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(0, 0, 0, 0), 0, 0));
				rulesPanel.setPreferredSize(new java.awt.Dimension(600, 200));
				rulesPanel.setBorder(new LineBorder(new java.awt.Color(0,0,0), 1, false));
				rulesPanel.setBackground(new java.awt.Color(225,225,225));
				rulesPanelLayout.rowWeights = new double[] {0.1, 0.1, 0.1, 0.1};
				rulesPanelLayout.rowHeights = new int[] {7, 7, 7, 7};
				rulesPanelLayout.columnWeights = new double[] {0.1, 0.1, 0.1, 0.1};
				rulesPanelLayout.columnWidths = new int[] {7, 7, 7, 7};
				rulesPanel.setLayout(rulesPanelLayout);
				{
					jScrollPane1 = new JScrollPane();
					rulesPanel.add(jScrollPane1, new GridBagConstraints(0, 0, 4, 4, 0.0, 0.0, GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(0, 0, 0, 0), 0, 0));
					{
						rulesTextArea1 = new TextAreaCapoAutomatico(90);	
						jScrollPane1.setViewportView(rulesTextArea1);
						setRulesText();
						rulesTextArea1.setCaretPosition(0);
						rulesTextArea1.setEditable(false);
					
					}
				}
			}
			{
				titleLabel = new JLabel();
				getContentPane().add(titleLabel, new GridBagConstraints(1, 0, 1, 1, 0.0, 0.0, GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(0, 0, 0, 0), 0, 0));
				titleLabel.setText("Benvenuto! ");
			}
			{
				jPanel1 = new JPanel();
				GridBagLayout jPanel1Layout = new GridBagLayout();
				getContentPane().add(jPanel1, new GridBagConstraints(1, 2, 1, 3, 0.0, 0.0, GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(0, 0, 0, 0), 0, 0));
				jPanel1.setSize(600, 100);
				jPanel1.setPreferredSize(new java.awt.Dimension(600, 200));
				jPanel1.setBorder(new LineBorder(new java.awt.Color(0,0,0), 1, false));
				jPanel1Layout.rowWeights = new double[] {0.1, 0.1, 0.1, 0.1};
				jPanel1Layout.rowHeights = new int[] {7, 7, 7, 7};
				jPanel1Layout.columnWeights = new double[] {0.1, 0.1, 0.1, 0.1};
				jPanel1Layout.columnWidths = new int[] {7, 7, 7, 7};
				jPanel1.setLayout(jPanel1Layout);
				{
					nameLabel = new JLabel();
					jPanel1.add(nameLabel, new GridBagConstraints(0, 0, 1, 1, 0.0, 0.0, GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(0, 0, 0, 0), 0, 0));
					nameLabel.setText("Nome");
					nameLabel.setFont(new java.awt.Font("Dialog",0,18));
				}
				{
					surnameLabel = new JLabel();
					jPanel1.add(surnameLabel, new GridBagConstraints(0, 1, 1, 1, 0.0, 0.0, GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(0, 0, 0, 0), 0, 0));
					surnameLabel.setText("Cognome");
					surnameLabel.setFont(new java.awt.Font("Dialog",0,18));
				}
				{
					idLabel = new JLabel();
					jPanel1.add(idLabel, new GridBagConstraints(0, 2, 1, 1, 0.0, 0.0, GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(0, 0, 0, 0), 0, 0));
					idLabel.setText("Matricola");
					idLabel.setFont(new java.awt.Font("Dialog",0,18));
				}
				{
					nameTextField = new JTextField();
					jPanel1.add(nameTextField, new GridBagConstraints(2, 0, 2, 1, 0.0, 0.0, GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0, 0, 0, 0), 0, 0));
					nameTextField.setPreferredSize(new java.awt.Dimension(300, 35));
				}
				{
					surnameTextField = new JTextField();
					jPanel1.add(surnameTextField, new GridBagConstraints(2, 1, 1, 1, 0.0, 0.0, GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0, 0, 0, 0), 0, 0));
					surnameTextField.setPreferredSize(new java.awt.Dimension(300, 35));
					surnameTextField.setSize(300, 35);
				}
				{
					idTextField = new JTextField();
					jPanel1.add(idTextField, new GridBagConstraints(2, 2, 1, 1, 0.0, 0.0, GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0, 0, 0, 0), 0, 0));
					idTextField.setPreferredSize(new java.awt.Dimension(300, 35));
				}
				{
					sendFormButton = new JButton();
					jPanel1.add(sendFormButton, new GridBagConstraints(3, 3, 1, 1, 0.0, 0.0, GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(0, 0, 0, 0), 0, 0));
					sendFormButton.setText("Invia!");
					sendFormButton.addActionListener(new ActionListener() {
						public void actionPerformed(ActionEvent evt) {
							
							int response = JOptionPane.showOptionDialog(null, "ATTENZIONE: Hai inserito i seguenti dati:\n\n\n" +
															   "NOME:\t\t" + nameTextField.getText() + "\n" + 
															   "COGNOME:\t\t" + surnameTextField.getText() + "\n" +
															   "MATRICOLA:\t\t" + idTextField.getText() + "\n\n\n" + 
															   "Desideri davvero inviare questi dati?",
															   "Conferma immissione dati personali", JOptionPane.YES_NO_OPTION, JOptionPane.WARNING_MESSAGE, null, null, null);
							
							if(response == JOptionPane.YES_OPTION)
								sendLoginRequest();

						}
					});
				}
			}
			pack();
			this.setSize(654, 469);
		} catch (Exception e) {
		    //add your error handling code here
			e.printStackTrace();
		}
	}
	
	private void setRulesText()
	{
		String text = "REGOLE TORNEO OTHELLO\n\n";
		text = text + "Benvenuto al primo torneo di Othello della facoltà di Ingegneria!\n\n";
		text = text + "La sfida consiste nel riuscire a sconfiggere IAgo, un giocatore 'Artificiale' (molto molto cattivo!) progettato e realizzato da studenti della Laurea Magistrale di Ingegneria Informatica nell'ambito del corso di Intelligenza Artificiale.\n\n";
		text = text + "Lo scopo di questo torneo è quello di raccogliere dati statistici sulle performance di IAgo rispetto a esseri umani, nonchè di PREMIARE lo studente migliore nella sfida contro IAgo!\n\n";
		text = text + "REGOLAMENTO\n\nIl gioco mette a disposizione 5 diversi livelli di difficoltà: PRINCIPIANTE, APPRENDISTA, INTERMEDIO, ESPERTO, MOLTO ESPERTO. Il giocatore può giocare un qualunque numero di partite ai livelli PRINCIPIANTE e APPRENDISTA (utile per poter familiarizzare con il gioco e le semplici regole dell'Othello). Queste partite, però,  non vengono utilizzate ai fini della classifica. \n\n";
		text = text + "Il torneo vero e proprio tiene conto solamente delle partite disputate ai livelli di difficoltà INTERMEDIO, ESPERTO e MOLTO ESPERTO. \n";
		text = text + "E' possibile svolgere complessivamente un totale di SOLE 3 PARTITE a questi livelli di difficoltà. In base al risultato ottenuto in queste 3 partite e al livello di difficoltà scelto, verrà assegnato un punteggio allo studente.\n\n";
		text = text + "Tale punteggio è calcolato in questo modo:\n\n";
		text = text + "PUNTEGGIO =      (RISULTATO_PARTITA_1 * DIFFICOLTA_PARTITA_1) \n\t+ (RISULTATO_PARTITA_2 * DIFFICOLTA_PARTITA_2) \n\t+ (RISULTATO_PARTITA_3 * DIFFICOLTA_PARTITA_3)\n\n";
		text = text + "RISULTATO_PARTITA vale :\t2 in caso di VITTORIA\n\t\t1 in caso di PAREGGIO\n\t\t0 in caso di SCONFITTA\n\n";
		text = text + "DIFFICOLTA_PARTITA vale :     7 se si gioca contro IAgo a livello MOLTO ESPERTO\n\t\t2 se si gioca contro IAgo a livello ESPERTO\n\t\t1 se si gioca contro IAgo a livello INTERMEDIO\n\n";
		text = text + "ESEMPIO: Lo studente Sheldon Cooper ha disputato 3 partite ottenendo questi risultati:\n\n\t\t1 VITTORIA contro IAgo INTERMEDIO\n\t\t1 PAREGGIO contro IAgo ESPERTO\n\t\t1 SCONFITTA contro IAgo MOLTO ESPERTO\n";
		text = text + "Il suo punteggio in classifica sarà: ";
		text = text + "PUNTEGGIO = (2 * 1 + 1 * 2 + 0 * 7) = 4\n\n";
		text = text + "In caso di pareggi in classifica, verrà valutata la differenza-punti ottenuta nelle singole partite.\n";
		text = text + "Il torneo si svolgerà il giorno 11/11/2013 dalle ore 09:00 alle ore 14:00. In questo periodo sarà possibile partecipare utilizzando i computer del laboratorio multimediale T25 della Facoltà di Ingegneria dell'Universita' di Salerno. ";
		text = text + "Alla chiusura del torneo lo studente primo in classifica verra' premiato con un laptop 'Acer Aspire One'!!\n\n";
		text = text + "Sarai in grado di battere IAgo?";
		

	
		rulesTextArea1.setText(text ,true);
		
	}
	private void sendLoginRequest(){
		
			
			
			/*
			 * Per fare l'UDPDiscovery mando un pacchetto Broadcast che richiede l'indirizzo IP e la porta del server.Il server (se � on line)
			 * risponde mandando queste info!
			 
			
			UDPDiscoverer discover = new UDPDiscoverer(ServerWindow.BROADCAST_IP_ADDRESS, ServerWindow.BROADCAST_PORT );
			addressIPServer = discover.getServerAddress(5000);
			portServer = discover.getServerPort(5000);
			*/
			
			
			//prendo i dati dal form
			String ID = idTextField.getText();
			
			String errorMessageID = validateID(ID);
			if(errorMessageID != null){
				JOptionPane.showMessageDialog(null, errorMessageID);
			}
			else{
				try {	
					socket = new Socket(addressIPServer, portServer);
					
					System.out.println("Socket creata, connessione con "+ addressIPServer +" alla porta "+ portServer);
					//creo il PrintWriter per la scrittura in uscita e il buffer di ingresso
					PrintWriter out = new PrintWriter(new OutputStreamWriter(socket.getOutputStream(), "UTF-8"));
					BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream(), "UTF-8"));					
					
					String name =  nameTextField.getText();
					String surname = surnameTextField.getText();
					
					
					//mando la richiesta al server
					out.println("login");
					out.println(ID);
					out.println(name);
					out.println(surname);

					out.flush();
					
					System.out.println("CLIENT: sto inviando richiesta per " + name +" " + surname + " " + ID + "\n" );

					String status = in.readLine();
					
					
					if (status.equals("NACK"))
					{
						System.out.println("CLIENT: ricevuto NACK dal server\n");
						String errorCode = in.readLine();
						if(errorCode.equals("2"))
							JOptionPane.showMessageDialog(this, "ATTENZIONE: hai esaurito il numero di partite disponibili!");
						else if(errorCode.equals("3"))
							JOptionPane.showMessageDialog(this, "ATTENZIONE: non sei autorizzato a giocare!");
						else if(errorCode.equals("1"))
							JOptionPane.showMessageDialog(this, "ATTENZIONE: non sei iscritto al torneo!");

					}
					else if (status.equals("ACK")){
						System.out.println("CLIENT: ricevuto ACK dal server\n");
						
					//	String securityCode = in.readLine();
						String gamesLeft = in.readLine();
						
						IntroWindowClient.getActualWindow().setVisible(false);
						
						//si pu� usare il metodo dispose
						
						MainWindowClient inst = new MainWindowClient(gamesLeft,ID,name,surname,addressIPServer);
					//	inst.disableMenuItems();
						inst.setLocationRelativeTo(null);
						inst.setVisible(true);

					}	
					socket.close();							
				} catch (UnknownHostException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
					JOptionPane.showMessageDialog(this, "ATTENZIONE: Problemi di connessione! Riprovare piu' tardi!");
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
					JOptionPane.showMessageDialog(this, "ATTENZIONE: Problemi di connessione! Riprovare piu' tardi!");
				}
			}
			

	}
	public static IntroWindowClient getActualWindow() {
		return actualWindow;
	}
	public static void setActualWindow(IntroWindowClient actualWindow) {
		IntroWindowClient.actualWindow = actualWindow;
	}
	private String validateID(String ID){
		
		//verifica numero caratteri
		
		
		boolean valid = true;
		String errorMessage = null;
		
		
		if(ID.length() != 10){
			valid = false;
			errorMessage = "ERRORE NELL'INSERIMENTO DEL NUMERO DI MATRICOLA!\n Il numero di matricola inserito ha un numero di cifre diverso da 10!";
		}
			
		
		//verifica solo cifre
		for (int i=0; i<ID.length() && (valid == true); i++) {
			char c = ID.charAt(i);
			if(!Character.isDigit(c)){
				valid = false;
				errorMessage = "ERRORE NELL'INSERIMENTO DEL NUMERO DI MATRICOLA!\n Il numero di matricola inserito contiene caratteri non numerici!";
			}
				
		}
		return errorMessage;
		
	}

}
